package com.designPattern.adapter.dispatchServlet;

import com.designPattern.adapter.adapter.Adapter;
import com.designPattern.adapter.adapter.AnnotationAdapter;
import com.designPattern.adapter.adapter.HttpAdapter;
import com.designPattern.adapter.adapter.SimpleAdapter;
import com.designPattern.adapter.controller.Controller;
import com.designPattern.adapter.controller.HttpController;

import java.util.ArrayList;
import java.util.List;

/**
 * 【适配器模式】
 * 【适配器】
 * 在DispatcherServlet源码中
 * 1.先通过request，调用getHandler方法获取Handler对象
 * 2.再通过Handler，调用getHandlerAdapter()获取相应的适配器HandlerAdapter对象
 * 3.再调用HandlerAdapter中的handle方法调用handler对象获取ModelAndView对象
 * 完成适配器模式
 * 【优点】如果需要增加新得Handler对象，只需要创建相应的HandlerAdapter对象,在DispatcherServlet中的List<HandlerAdapter>
 *     中添加HandlerAdapter对象即可
 */
public class DispatchServlet {
    //创建适配器的集合列表
    List<Adapter> list = new ArrayList();
    //创建一个Controller对象
    Controller controller = null;
    public DispatchServlet(){
        //初始化的时候就将所有适配器加入到列表中
        list.add(new SimpleAdapter());
        list.add(new HttpAdapter());
        list.add(new AnnotationAdapter());
    }
    //这里只是模拟获得Controller请求
    public void setController(Controller controller) {
        this.controller = controller;
    }
    //获得相应的适配器对象
    //调用请求的相应方法
    public void doDispatch(){
        //获取相应的适配器
        Adapter handler = getHandler(controller);
        if (handler != null) {
            //调用Controller中的方法
            handler.handle(controller);
        }
    }
    //根据请求获取适配器对象
    public Adapter getHandler(Controller controller){
        for (Adapter adapter : list) {
            if (adapter.supports(controller)){
                return adapter;
            }
        }return null;
    }
}
